<?php
/**
 * スターティングメンバーコンポーネントオブジェクト
 */
require_once 'Smarty/Components/select.php';
require_once dirname(__FILE__) . '/../Components.php';
require_once dirname(__FILE__) . '/MemberSelectMenuMapper.php';
require_once dirname(__FILE__) . '/GakunenSelect.php';
require_once dirname(__FILE__) . '/MemberSelect.php';
require_once 'Smarty/Components/simpletable.php';
require_once 'Smarty/Components/displayswitch.php';
require_once 'Request/Request.php';
require_once APPLICATION_PATH . '/models/StartingMember/xml/StartingMemberXml.php';
require_once APPLICATION_PATH . '/models/HttpRequest/HttpRequestController.php';

/**
 * スターティングメンバーコンポーネントオブジェクト
 * Enter description here ...
 * @author shinichi
 * <br /><a href="https://www.evernote.com/view/afc80c9c-d397-42f0-a476-f049fe8975a0?locale=ja#b=90ccea2f-37a9-463f-89cf-099ea98d1d1f&n=afc80c9c-d397-42f0-a476-f049fe8975a0">NOTE</a>
 *
 */
class Components_StartingMember_Controller extends Components
{
	/** テンプレートファイル名 */
	const TEMPLATE_NAME = 'Controller.tpl';
	/** ディスプレースイッチＪＡＶＡＳＣＲＩＰＴメソッド名 */
	const JAVASCRIPT_METHOD_NAME_DISPSWITCH = 'gakunenswich';
	/** HTTPリクエストキー：ゲームＩＤ */
//	const HTTP_REQUEST_KEY_GAMEID = 'GAMEID';

	/** @var メンバーデータマッパ */
	protected $_objMapper;
	/** @var 学校タイプ */
	protected $_SchoolType;
	/** @var メニュー学年選択コンポーネントオブジェクト */
	protected $_objSelectGakunen;
	/** @var メニューメンバー選択オブジェクト */
	protected $_objSelectMember;
	/** @var メニューメンバー選択オブジェクトリスト */
	protected $_objSelectMemberList;
	/** @var メニューポジション選択オブジェクト */
	protected $_objSelectPosition;
	/** @var Javascript用年齢リスト */
	protected $_aryAgeList;
	/** @var メンバーリスト：１年生 */
	protected $_MemberList1;
	/** @var メンバーリスト：２年生 */
	protected $_MemberList2;
	/** @var メンバーリスト：３年生 */
	protected $_MemberList3;
	/** @var メンバーリスト：４年生 */
	protected $_MemberList4;
	/** @var メンバーリスト：５年生 */
	protected $_MemberList5;
	/** @var メンバーリスト：６年生 */
	protected $_MemberList6;
	/** @var シンプルテーブルコンポーネントクラス */
	protected $_objSimpleTable;
	/** @var メンバー選択メニュー非表示スイッチＪＳコンポーネント */
	protected $_objJsDSwitch;

	/** @var フォームアクション */
	public $ACTION;

	/** @var スターティングメンバーデータセット */
	protected $_StartingMemberDataset;

	/**
	 * コンストラクタ
	 * @param  $sCompileId
	 * @param $sAction
	 * @param  $sSchoolType
	 */
	public function __construct($sCompileId, $sAction, $sSchoolType=Models_Players_Controller::JUNIOR_SCHOOL)
	{
		parent::__construct(dirname(__FILE__), $sCompileId);

		// 保存済みスタメンから初期選択状態を設定する
		$this->_setFirstSelectedMenuFromDataset();

		$this->_objSimpleTable = new Smarty_Components_Simpletable($this->_sCompileDir, $sCompileId, 3);
		$this->_objSimpleTable->setTableHeaderSell(0, 'ポジション');
		$this->_objSimpleTable->setTableHeaderSell(1, '学年');
		$this->_objSimpleTable->setTableHeaderSell(2, '選手氏名');

		$this->_objJsDSwitch = new Smarty_Components_Displayswitch($this->_sCompileDir, $sCompileId, self::JAVASCRIPT_METHOD_NAME_DISPSWITCH);
		$this->_objMapper = new Components_MemberSelectMenu_Mapper($sSchoolType);
		$this->_SchoolType = $sSchoolType;
		$this->_createViewMemberList();
		$this->_initSelectMember2();
		$this->_initAgeValueForJavascript();

		$this->ACTION = $sAction;
	}

	/***
	 * 保存済みスタメンから初期選択状態を設定する
	* ＨＴＴＰリクエストからゲーム識別を取得しゲーム識別に該当するスタメン情報を検索取得する
	* メニュー初期選択状態の設定は、メニューコントローラが呼応する
	* ＨＴＴＰりくえすとスーパーグローバルに値を設定することで実現する
	* メニューコントローラに呼応するＨＴＴＰリクエストスーパーグローバルが設定済みである場合
	* 保存データを無視する
	*/
	protected function _setFirstSelectedMenuFromDataset()
	{
		$objRequest = new Lib_Request();
		// HTTPリクエストから試合識別を取得する
		$sGid = $objRequest->get(HttpRequest::GAME_ID);
		/***
		 * 試合識別が設定されていない場合処理を終了する
		 */
		if ( $sGid == '' ) {
			return;
		}
		// スターティングメンバーデータセット読み込み
		$this->_loadStartingMemberDatasetByGameId();
		// 選択メニュー選択状態設定
		$this->_setHttpRequestFromStartingMemberDataset();
	}

	/**
	 * フェッチ
	 * (non-PHPdoc)
	 * @see Smarty_Components::fetch()
	 */
	public function fetch()
	{
		$this->view->aryAge = $this->_aryAgeList;
		$this->view->SELECT_GAKUNEN = $this->_objSelectGakunen->fetch();
//		$this->view->SELECT_NAME = $this->_objSelectMember->fetch();
		$this->view->SELECT_NAME = $this->_objSelectMemberList->fetch();
		$this->view->simpletable = $this->_objSimpleTable->fetch();
		$this->view->jsCHDISP = $this->_objJsDSwitch->fetch();
		$this->view->ACTION = $this->ACTION;
		$sHtml = parent::fetch(self::TEMPLATE_NAME);
		return $sHtml;
	}

	/**
	 * スターティングメンバーデータセットをロード
	 * ＨＴＴＰリクエストのゲームＩＤをキーに検索
	 * ゲームＩＤがなければ何もしない
	 * @link http://evernote:///view/9639069/s89/2aaf75b4-c945-4e40-8a2d-10d0bd5c78c4/2aaf75b4-c945-4e40-8a2d-10d0bd5c78c4/
	*/
	protected function _loadStartingMemberDatasetByGameId()
	{
		$this->_StartingMemberDataset = array();
		/***
		 * HTTPリクエストからＧＡＭＥＩＤ取得
		 */
		$objRequest = new Lib_Request();
		$GameId = $objRequest->get(HttpRequest::GAME_ID);
		if ( $GameId == '' ) {
			return;
		}

		/***
		 * スターティングメンバーデータセット読み込み
		 */
		$objStartingMemberDataset = new Models_StartingMember_Xml($GameId);
		$this->_StartingMemberDataset = $objStartingMemberDataset->getDataset();
	}

	/**
	 * スターティングメンバーデータセットからHTPPリクエストに値を設定する
	 * HTTPリクエストに値を設定すると、HTTPリクエストの対応するフォームメニューの
	 * HTTPリクエストにすでに値が設定されている場合、データセットの値を破棄する
	 * 選択状態が設定される。
	 */
	protected function _setHttpRequestFromStartingMemberDataset()
	{
		/***
		 * スターティングメンバー情報をＨＴＴＰリクエストに設定する
		 */
		$i = 0;
		foreach ( $this->_StartingMemberDataset as $MemberInfo ) {
			/***
			 * 学年リクエスト設定
			 */
			/*** リクエストキーネーム生成(学年) */
			$sHttpRequestNameAge = 'P' . $i;
			/***
			 * すでに値が設定されている場合、データセットを破棄しコンティニュー
			 */
			if ( !empty($_REQUEST[$sHttpRequestNameAge]) ) {
				continue;
			}
			/*** リクエストバリュー（学年）生成 */
			$sHttpRequestValueAge = 'P'.$i.$MemberInfo[Models_StartingMember::KEY_AGE];
			/*** HTTPリクエスト（学年)設置 */
			$_REQUEST[$sHttpRequestNameAge] = $sHttpRequestValueAge;

			/***
			 * 選手リクエスト設定
			 */
			/*** リクエストネーム生成（選手） */
			$sHttpRequestNameMember = $sHttpRequestValueAge;
			/*** リクエストバリュー生成（選手）*/
			$sHttpRequestValueMember = $MemberInfo[Models_StartingMember::KEY_ID];
			/*** HTTPリクエスト（選手）設置 */
			$_REQUEST[$sHttpRequestNameMember] = $sHttpRequestValueMember;

			/*** ０エントリはGK固定 */
			if ( $i == 0 ) {
				$i ++;
				continue;
			}
			/*** 0エントリはGK固定なので以下の処理(ポジションデータの取得)はスキップ */

			/***
			 * ポジションリクエスト設定
			 */
			/*** リクエストネーム生成（ポジション） */
			$sHttpRequestNamePosition = 'POS' . $i;
			/*** リクエストバリュー生成（ポジション） */
			$sHttpRequestValuePosition = $MemberInfo[Models_StartingMember::KEY_POSITION];
			/*** HTTPリクエスト（ポジション）設定 */
			$_REQUEST[$sHttpRequestNamePosition] = $sHttpRequestValuePosition;

			$i ++;
		}
	}

	/**
	 * ポジションメニュー初期化
	 * 表示メニューに
	 * ＢＫ（バックス）・ＭＤ（ミッドフィルダー）・ＦＷ（フォワード）
	 * を設定する
	 */
	protected function _initSelectPosition($iPositionNum)
	{
		$aryOptions = array(
			'BK'=>'BK',
			'MD'=>'MD',
			'FW'=>'FW'
		);
		$this->_objSelectPosition
		= new Smarty_Components_Select($this->_sCompileDir, $this->_sCompileId, 'POS'.$iPositionNum, $aryOptions);
	}

	/**
	 * Javascript用年齢リスト初期化
	 */
	protected function _initAgeValueForJavascript()
	{
		$iStartAge = 7;
		switch($this->_SchoolType) {
			case Models_Players_Controller::JUNIOR_SCHOOL:
				$iStartAge = 7;
				break;
			case Models_Players_Controller::MIDDLE_SCHOOL:
				$iStartAge = 13;
				break;
			case Models_Players_Controller::HIGH_SCHOOL:
				$iStartAge = 16;
				break;
		}

		$this->_aryAgeList = array();
		$iLimit = 6;
		$i = 0;

		/** 全学年の検索キー[Ux～Ｕx]設置 */
		while ( $i < $iLimit ) {
			$iAge = $iStartAge + $i;
			$this->_aryAgeList[$i] = 'U' . $iAge;
			$i ++;
		}
	}

	/**
	 * 表示用メンバーリスト作成
	 */
	protected function _createViewMemberList()
	{
		/*** 初学年年齢取得 */
		$iStartAge = Models_Players_Controller::getStartAge($this->_SchoolType);
		$iStep = $iStartAge;
		$sKey = 'U' . $iStep;
		$this->_MemberList1 = $this->_objMapper->getPlayerList(array($sKey));

		$iStep = $iStartAge + 1;
		$sKey = 'U' . $iStep;
		$this->_MemberList2 = $this->_objMapper->getPlayerList(array($sKey));

		$iStep = $iStartAge + 2;
		$sKey = 'U' . $iStep;
		$this->_MemberList3 = $this->_objMapper->getPlayerList(array($sKey));

		$iStep = $iStartAge + 3;
		$sKey = 'U' . $iStep;
		$this->_MemberList3 = $this->_objMapper->getPlayerList(array($sKey));

		/***
		 * 小学校の場合６年生まで
		 */
		if ( $this->_SchoolType == Models_Players_Controller::JUNIOR_SCHOOL ) {

			$iStep = $iStartAge + 4;
			$sKey = 'U' . $iStep;
			$this->_MemberList4 = $this->_objMapper->getPlayerList(array($sKey));

			$iStep = $iStartAge + 5;
			$sKey = 'U' . $iStep;
			$this->_MemberList5 = $this->_objMapper->getPlayerList(array($sKey));

			$iStep = $iStartAge + 6;
			$sKey = 'U' . $iStep;
			$this->_MemberList6 = $this->_objMapper->getPlayerList(array($sKey));
		}
	}

	/**
	 * 学年選択メニュー初期化
	 */
	protected function _initSelectGakunen($sName = Models_Players_Controller::JUNIOR_SCHOOL)
	{
		$sCompileDir = $this->_sCompileDir;
		$sCompileId = $this->_sCompileId;
		switch ($this->_SchoolType){
			case Models_Players_Controller::JUNIOR_SCHOOL:
				$aryOptions[$sName.'U7'] = '1年生';
				$aryOptions[$sName.'U8'] = '2年生';
				$aryOptions[$sName.'U9'] = '3年生';
				$aryOptions[$sName.'U10'] = '4年生';
				$aryOptions[$sName.'U11'] = '5年生';
				$aryOptions[$sName.'U12'] = '6年生';
				break;
			case Models_Players_Controller::MIDDLE_SCHOOL:
				$aryOptions[$sName.'U13'] = '1年生';
				$aryOptions[$sName.'U14'] = '2年生';
				$aryOptions[$sName.'U15'] = '3年生';
				break;
			case Models_Players_Controller::HIGH_SCHOOL:
				$aryOptions[$sName.'U16'] = '1年生';
				$aryOptions[$sName.'U17'] = '2年生';
				$aryOptions[$sName.'U18'] = '3年生';
				break;
		}
		$Id = '';
		$this->_objSelectGakunen
		= new Components_StartingMember_Gakunen_Select(
				$sCompileDir,
				$sCompileId,
				$sName,
				$aryOptions,
				$Id);
	}

	/**
	 * 対象年齢のメンバーリスト（OPTIONパラメータ用）を返す
	 * @param $iAge 対象年齢
	 * @return array
	 */
	protected function _createGakunenOption($iAge)
	{
		$aryResult = array();

		/***
		 * メンバー検索
		 */
		$sAge = 'U' . $iAge;
		$aryMemberList = $this->_objMapper->getPlayerList(array($sAge));

		/** 未選択文字列設定 */
		$aryResult[$sAge] = '--' . Models_Players_Controller::_getGakunenFromAge($iAge).'年生指名--';

		/** メンバー設置 */
		foreach ($aryMemberList as $aryMemberInfo) {
			$aryResult[$aryMemberInfo[Models_Players_Controller::KEY_ID]]
			= $aryMemberInfo[Models_Players_Controller::KEY_NAME];
		}

		return $aryResult;
	}


	/**
	 * メンバー選択メニュー初期化2
	 */
	protected function _initSelectMember2()
	{
		/*** 初学年年齢取得 */
		$iStartAge = Models_Players_Controller::getStartAge($this->_SchoolType);
		/*** 卒業学年取得 */
		$iSotugyoGakunen = Models_Players_Controller::getSotugyoGakunen($this->_SchoolType);

		/***
		 * 選手選択メニューコントローラインスタンス
		 */
		$this->_objSelectMemberList
		= new Components_StartingMember_MemberSelect($this->_sCompileDir, $this->_sCompileId);

		$iPositionNum = 11;
		/***
		 * 学校タイプによるポジション数設定
		 */
		if ( $this->_SchoolType == Models_Players_Controller::JUNIOR_SCHOOL ) {
			$iPositionNum = 8;
		}

		$i = 0;
		/***
		 * 全ポジション分ループ
		 */
		while ( $i < $iPositionNum ) {
			/***
			 * 全学年の選手メニューをＨＩＤＤＥＮ属性で作成する
			 */
			$this->_createSelectMenuParPosition($iStartAge, $iSotugyoGakunen, $i) ;
			/***
			 * 先頭エントリはＧＫ固定
			 */
			if ( $i == 0 ) {
				$this->_objSimpleTable->setSell($i, 0, 'GK');
			} else {
				/***
				 * ポジションメニュー設置
				 */
				$this->_initSelectPosition($i);
				$htmlPosition = $this->_objSelectPosition->fetch();
				$this->_objSimpleTable->setSell($i, 0, $htmlPosition);
			}
			$this->_initSelectGakunen('P'.$i);
			$this->_objSimpleTable->setSell($i, 1, $this->_objSelectGakunen->fetch());
			$this->_objSimpleTable->setSell($i, 2, $this->_objSelectMemberList->fetch());

			$i ++;
		}
	}

	/**
	 * ポジション行ごとのメニューを作成する
	 * @param  $iStartAge 学年開始年齢
	 * @param  $iSotugyoGakunen 卒業学ｊねん
	 * @param  $iPositionNum ポジション番号
	 */
	protected function _createSelectMenuParPosition($iStartAge, $iSotugyoGakunen, $iPositionNum)
	{

		/***
		 * ＳＥＬＥＣＴコンポーネント定数部事前設定
		*/
		$sCompileDir = $this->_sCompileDir;
		$sCompileId = $this->_sCompileId;
		$sName = Models_Players_Controller::KEY_ID;

		$i = 0;
		/***
		 * 全学年回数
		*/
		while ($i < $iSotugyoGakunen) {
			/*** 年齢変換 */
			$iAge = $iStartAge + $i;
			/** セレクトオプション取得 */
			$aryMemberOptionGakunen = $this->_createGakunenOption($iAge);

			/**
			 * セレクトＨＴＭＬ生成
			 */
			$sSelectName = 'P' . $iPositionNum . 'U'.$iAge;
			$objComponentSelect
			= new Smarty_Components_Select($sCompileDir, $sCompileId, $sSelectName, $aryMemberOptionGakunen);
			$htmlSelect = $objComponentSelect->fetch();

			/** ひとがくねんぶん登録 */
			$this->_objSelectMemberList->setHtmlSelectMemberList($i, $sSelectName, $htmlSelect);

			$i ++;
		}
	}

	/**
	 * メンバー選択メニュー初期化
	 */
	protected function _initSelectMember()
	{
		/***
		 * メニューオプション作成
		 */
		$aryOptions = array();
		/*** 初学年年齢取得 */
		$iStartAge = Models_Players_Controller::getStartAge($this->_SchoolType);
		/*** 卒業学年取得 */
		$iSotugyoGakunen = Models_Players_Controller::getSotugyoGakunen($this->_SchoolType);

		$i = 0;
		/***
		 * 全学年回数
		 */
		while ($i < $iSotugyoGakunen) {
			$iAge = $iStartAge + $i;
			$aryMemberOptionGakunen = $this->_createGakunenOption($iAge);
			$aryOptions = array_merge($aryOptions, $aryMemberOptionGakunen);
			$i ++;
		}

		$sCompileDir = $this->_sCompileDir;
		$sCompileId = $this->_sCompileId;
		$sName = Models_Players_Controller::KEY_ID;

		$this->_objSelectMember
		= new Smarty_Components_Select($sCompileDir, $sCompileId, $sName, $aryOptions, $sName);
	}

	/**
	 * 選手選択メニューSELECTタグOPTION作成
	 * @return array OPTION 連想配列
	 */
	protected function _createOptionSelectMember()
	{

	}
}